[이코테-이진탐색]_떡볶이 떡 만들기


문제 설명

서로 다른 길이의 떡볶이를 H 길이만큼 잘라 더한 값이 손님이 주문한 M 길이가 될 수 있는지 확인하는 문제(H의 최대 길이를 구해야 한다.)

My Solution

n, m = map(int, input().split())
arr = list(map(int, input().split()))

start = 0
end = max(arr)

# 이진 탐색 수행(반복적)
result = 0
while start <= end:
    total = 0
    mid = (start + end) // 2
    for x in arr:
        # 잘랐을 때의 떡의 양 계산
        if x > mid:
            total += x - mid
    # 떡의 양이 부족한 경우 더 많이 자르기(왼쪽 부분 탐색)
    if total < m:
        end = mid - 1
    # 떡의 양이 충분한 경우 덜 자르기(오른쪽 부분 탐색)
    else:
        result = mid # 최대한 덜 잘랐을 때가 정답이므로, 여기에서 result에 기록
        start = mid + 1


print(result)

문제 풀이

  • 최대 떡의 개수(N)이 100만개, 손님이 주문한 길이(M)이 2000만으로 순차 탐색으로 하나씩 찾는다면 시간 초과가 발생한다.
  • 이진 탐색으로 떡마다 중간 값(최대로 자를 수 있는 길이max(arr)와, 0의 중간 값 (mid))를 잘라 더한 뒤 값이 부족할 경우 중간 값을 줄여 total의 값을 증가시킨다.
  • 또한 total의 값이 충분할 경우 중간 값을 올려(mid + 1) total의 값을 최대한 감소시킨다. 즉, H의 길이가 최대가 된다.

Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github